# http://stackoverflow.com/questions/6862742/draw-a-circle-with-ggplot2
circle_fun <- function(center=c(0,0), diameter=1, npoints=500, start=0, end=2){
tt <- seq(start*pi, end*pi, length.out=npoints)
data.frame(
x = center[1] + diameter / 2 * cos(tt),
y = center[2] + diameter / 2 * sin(tt)
)
}
# Gives y coordinates of the opposite side
rev_y <- function(y) 94-y
# From x and y coordinates for a line (represented by a polygon here),
# a number of group and a short description
# creates a data.frame for this line
# in order to use it with ggplot2.
new_coords <- function(x, y, group, descri){
new_coords_df <- data.frame(x = x, y = y)
new_coords_df$group <- group
new_coords_df$side <- 1
group <- group + 1
# The same thing for the opposite side
new_coords_df2 <- data.frame(x = x, y = rev_y(y))
new_coords_df2$group <- group
new_coords_df2$side <- 2
group <<- group + 1
# On reunit les donnees
new_coords_df <- rbind(new_coords_df, new_coords_df2)
new_coords_df$descri <- descri
return(new_coords_df)
}
# Restricted area
cercle_np_out <- circle_fun(center = c(25,5+3/12), diameter = (4+1/6)*2)
cercle_np_in <- circle_fun(center = c(25,5+3/12), diameter = 4*2)
# Three point
cercle_3pts_out <- circle_fun(center = c(25,5+3/12), diameter = (23+9/12)*2)
cercle_3pts_in <- circle_fun(center = c(25,5+3/12), diameter = (23+7/12)*2)
# Hoop
cercle_ce <- circle_fun(center = c(25,5+3/12), diameter = 1.5)
# Free Throws
cercle_lf_out <- circle_fun(center = c(25,19), diameter = 6*2)
cercle_lf_in <- circle_fun(center = c(25,19), diameter = (6-1/6)*2)
# Center Circle
cercle_mil_out <- circle_fun(center = c(25,47), diameter = 6*2)
cercle_mil_in <- circle_fun(center = c(25,47), diameter = (6-1/6)*2)
# Small Center Circle
cercle_mil_petit_out <- circle_fun(center = c(25,47), diameter = 2*2)
cercle_mil_petit_in <- circle_fun(center = c(25,47), diameter = (2-1/6)*2)
group <- 1
court <- new_coords(c(0-1/6,0-1/6,50 + 1/6,50 + 1/6), c(0 - 1/6,0,0,0 - 1/6), group = group, descri = "ligne de fond")
court <- rbind(court, new_coords(x = c(0-1/6,0-1/6,0,0), y = c(0,47-1/12,47-1/12,0), group = group, descri = "ligne gauche"))
court <- rbind(court, new_coords(x = c(50,50,50+1/6,50+1/6), y = c(0,47-1/12,47-1/12,0), group = group, descri = "ligne droite"))
court <- rbind(court, new_coords(x = c(0,0,3,3), y = c(28,28+1/6,28+1/6,28), group = group, descri = "marque entraineur gauche"))
court <- rbind(court, new_coords(x = c(47,47,50,50), y = c(28,28+1/6,28+1/6,28), group = group, descri = "marque entraineur droite"))
court <- rbind(court, new_coords(x = c(3,3,3+1/6,3+1/6), y = c(0,14,14,0), group = group, descri = "3pts bas gauche"))
court <- rbind(court, new_coords(x = c(47-1/6,47-1/6,47,47), y = c(0,14,14,0), group = group, descri = "3pts bas droit"))
court <- rbind(court, new_coords(x = c(17,17,17+1/6,17+1/6), y = c(0,19,19,0), group = group, descri = "LF bas gauche"))
court <- rbind(court, new_coords(x = c(33-1/6,33-1/6,33,33), y = c(0,19,19,0), group = group, descri = "LF bas droit"))
court <- rbind(court, new_coords(x = c(17,17,33,33), y = c(19-1/6,19,19,19-1/6), group = group, descri = "LF tireur"))
court <- rbind(court, new_coords(x = c(14-1/6,14-1/6,14,14), y = c(0,1/2,1/2,0), group = group, descri = "marque fond gauche"))
court <- rbind(court, new_coords(x = c(36,36,36+1/6,36+1/6), y = c(0,1/2,1/2,0), group = group, descri = "marque fond droit"))
court <- rbind(court, new_coords(x = c(19,19,19+1/6,19+1/6), y = c(0,19,19,0), group = group, descri = "LF gauche interieur"))
court <- rbind(court, new_coords(x = c(31-1/6,31-1/6,31,31), y = c(0,19,19,0), group = group, descri = "LF droite interieur"))
court <- rbind(court, new_coords(x = c(22, 22, 28, 28), y = c(4-1/6,4,4,4-1/6), group = group, descri = "planche"))
court <- rbind(court, new_coords(x = c(cercle_3pts_out[31:220,"x"], rev(cercle_3pts_in[31:220,"x"])),
y = c(cercle_3pts_out[31:220,"y"], rev(cercle_3pts_in[31:220,"y"])), group = group, descri = "cercle 3pts"))
court <- rbind(court, new_coords(x = c(cercle_np_out[1:250,"x"], rev(cercle_np_in[1:250,"x"])),
y = c(cercle_np_out[1:250,"y"], rev(cercle_np_in[1:250,"y"])), group = group, descri = "cercle non passage en force"))
court <- rbind(court, new_coords(x = c(20+1/6,20+1/6,20+8/12,20+8/12), y = c(13,13+1/6,13+1/6,13), group = group, descri = "marque bas gauche cercle LF"))
court <- rbind(court, new_coords(x = c(30-8/12,30-8/12,30-1/6,30-1/6), y = c(13,13+1/6,13+1/6,13), group = group, descri = "marque bas droite cercle LF"))
court <- rbind(court, new_coords(x = c(cercle_lf_out[1:250,"x"], rev(cercle_lf_in[1:250,"x"])),
y = c(cercle_lf_out[1:250,"y"], rev(cercle_lf_in[1:250,"y"])), group = group, descri = "cercle LF haut"))
court <- rbind(court, new_coords(x = c(cercle_lf_out[250:269,"x"], rev(cercle_lf_in[250:269,"x"])),
y = c(cercle_lf_out[250:269,"y"], rev(cercle_lf_in[250:269,"y"])), group = group, descri = "cercle LF partie 1"))
court <- rbind(court, new_coords(x = c(cercle_lf_out[288:308,"x"], rev(cercle_lf_in[288:308,"x"])),
y = c(cercle_lf_out[288:308,"y"], rev(cercle_lf_in[288:308,"y"])), group = group, descri = "cercle LF partie 2"))
court <- rbind(court, new_coords(x = c(cercle_lf_out[327:346,"x"], rev(cercle_lf_in[327:346,"x"])),
y = c(cercle_lf_out[327:346,"y"], rev(cercle_lf_in[327:346,"y"])), group = group, descri = "cercle LF partie 3"))
court <- rbind(court, new_coords(x = c(cercle_lf_out[365:385,"x"], rev(cercle_lf_in[365:385,"x"])),
y = c(cercle_lf_out[365:385,"y"], rev(cercle_lf_in[365:385,"y"])), group = group, descri = "cercle LF partie 4"))
court <- rbind(court, new_coords(x = c(cercle_lf_out[404:423,"x"], rev(cercle_lf_in[404:423,"x"])),
y = c(cercle_lf_out[404:423,"y"], rev(cercle_lf_in[404:423,"y"])), group = group, descri = "cercle LF partie 5"))
court <- rbind(court, new_coords(x = c(cercle_lf_out[442:462,"x"], rev(cercle_lf_in[442:462,"x"])),
y = c(cercle_lf_out[442:462,"y"], rev(cercle_lf_in[442:462,"y"])), group = group, descri = "cercle LF partie 6"))
court <- rbind(court, new_coords(x = c(cercle_lf_out[481:500,"x"], rev(cercle_lf_in[481:500,"x"])),
y = c(cercle_lf_out[481:500,"y"], rev(cercle_lf_in[481:500,"y"])), group = group, descri = "cercle LF partie 7"))
court <- rbind(court, new_coords(x = c(17-0.5,17-0.5,17,17), y = c(7,7+1/6,7+1/6,7), group = group, descri = "marque 1 LF gauche"))
court <- rbind(court, new_coords(x = c(17-0.5,17-0.5,17,17), y = c(8+1/6,8+1/3,8+1/3,8+1/6), group = group, descri = "marque 2 LF gauche"))
court <- rbind(court, new_coords(x = c(17-0.5,17-0.5,17,17), y = c(11+1/3,11.5,11.5,11+1/3), group = group, descri = "marque 3 LF gauche"))
court <- rbind(court, new_coords(x = c(17-0.5,17-0.5,17,17), y = c(14.5,14.5+1/6,14.5+1/6,14.5), group = group, descri = "marque 4 LF gauche"))
court <- rbind(court, new_coords(x = c(33,33,33+0.5,33+0.5), y = c(7,7+1/6,7+1/6,7), group = group, descri = "marque 1 LF droite"))
court <- rbind(court, new_coords(x = c(33,33,33+0.5,33+0.5), y = c(8+1/6,8+1/3,8+1/3,8+1/6), group = group, descri = "marque 2 LF droite"))
court <- rbind(court, new_coords(x = c(33,33,33+0.5,33+0.5), y = c(11+1/3,11.5,11.5,11+1/3), group = group, descri = "marque 3 LF droite"))
court <- rbind(court, new_coords(x = c(33,33,33+0.5,33+0.5), y = c(14.5,14.5+1/6,14.5+1/6,14.5), group = group, descri = "marque 4 LF droite"))
court <- rbind(court, new_coords(x = c(0-1/6,0-1/6,50+1/6,50+1/6), y = c(94/2-1/12,94/2, 94/2, 94/2-1/12), group = group, descri = "ligne mediane"))
court <- rbind(court, new_coords(x = c(cercle_mil_out[250:500,"x"], rev(cercle_mil_in[250:500,"x"])),
y = c(cercle_mil_out[250:500,"y"], rev(cercle_mil_in[250:500,"y"])), group = group, descri = "cercle milieu grand"))
court <- rbind(court, new_coords(x = c(cercle_mil_petit_out[250:500,"x"], rev(cercle_mil_petit_in[250:500,"x"])),
y = c(cercle_mil_petit_out[250:500,"y"], rev(cercle_mil_petit_in[250:500,"y"])), group = group, descri = "cercle milieu petit"))
court <- rbind(court, new_coords(x = cercle_ce[,"x"], y = cercle_ce[,"y"], group = group, descri = "anneau"))
library(ggplot2)
P <- ggplot() + geom_polygon(data = court, aes(x = x, y = y, group = group), col = "gray") +
coord_equal() +
ylim(-2,96) +
xlim(-5,55) +
scale_x_continuous(breaks = c(0, 12.5, 25, 37.5, 50)) +
scale_y_continuous(breaks = c(0, 23.5, 47, 70.5, 94)) +
xlab("") + ylab("") +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank(), axis.ticks.x = element_blank(),
axis.ticks.y = element_blank(), axis.title = element_blank()
)
P

#rotate the court
# Given the angle theta and the court data frame,
# rotates the coordinates of the court by an angle theta
rotate_court <- function(court, theta=pi/2){
court_r <- court
court_r$x <- court_r$x / 180 * pi
court_r$y <- court_r$y / 180 * pi
matrice_r <- matrix(c(cos(theta), sin(theta), -sin(theta), cos(theta)), ncol = 2)
coords_r <- apply(court_r[,c("x","y")], 1, function(x) x %*% matrice_r)
court_r$x <- coords_r[1,] ; court_r$y <- coords_r[2,]
court_r$x <- court_r$x * 180 / pi
court_r$y <- court_r$y * 180 / pi
return(court_r)
}
# Whole court with rotation
P_180 <- ggplot() + geom_polygon(data = rotate_court(court, theta = pi/2), aes(x = x, y = y, group = group), col = "gray") +
coord_equal() +
xlim(-2,96) +
ylim(-55,2) +
scale_x_continuous(breaks = c(0, 23.5, 47, 70.5, 94)) +
scale_y_continuous(breaks = c(0, -12.5, -25, -37.5, -50)) +
xlab("") + ylab("") +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank(), axis.ticks.x = element_blank(),
axis.ticks.y = element_blank(), axis.title = element_blank()
)
P_180

#half-court:
P_half_180 <- ggplot() + geom_polygon(data = rotate_court(court[court$side==1,], theta = pi/2), aes(x = x, y = y, group = group), col = "gray") +
coord_equal() +
xlim(-2,50) +
ylim(-55,2) +
scale_x_continuous(breaks = c(0, 23.5, 47)) +
scale_y_continuous(breaks = c(0, -12.5, -25, -37.5, -50)) +
xlab("") + ylab("") +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank(), axis.ticks.x = element_blank(),
axis.ticks.y = element_blank(), axis.title = element_blank()
)
P_half_180

#To add points, we can create another data.frame with coordinates of the position of the player, and a dummy variable indicating wether the player scored or not.
shoots <- data.frame(x = c(2,4), y = c(2,10), score = c(TRUE,FALSE))
# If you use a rotate function, don't forget to apply the same rotation
# to your shoots coordinates !
shoots <- rotate_court(shoots, theta = pi/2)
P_half_180 + geom_point(data = shoots, aes(x = x, y = y, col = score), alpha = .8) +
scale_color_manual(values = c("TRUE" = "#00FF00", "FALSE" = "#FF0000"))

library(plotly)
shoots <- data.frame(x = c(0,0,0,25,25,25,50,50,50),
y = c(0,47,94,0,47,94,0,47,94),
score = c("TL","TM","TR","ML","MM","MR","LL","LM","LR"))
# If you use a rotate function, don't forget to apply the same rotation
# to your shoots coordinates !
shoots <- rotate_court(shoots, theta = pi/2)
pp = P_180 + geom_point(data = shoots,
aes(x = x, y = y, col = score),
size=3,
alpha = .8)
#+scale_color_manual(values = c("TRUE" = "#00FF00", "FALSE" = "#FF0000"))
ggplotly(pp)
## Preprocess data to merge with the team
df_name_team = read.csv(file="C:/Users/hrli1/Desktop/2018 Spring/EDA/NBA_FINAL/NBA_data/Name_Team.csv")
df_name_team = df_name_team[,c("PERSON_ID","Team_Name")]
colnames(df_name_team)[1] = "player_id"
my_read = function(path,team=df_name_team){
temp = read.csv(file=path)
final = merge(temp,team,by = "player_id",all=TRUE)
return(final[ ,!(colnames(final) == "X")])
}
df_3pct = my_read(path = "C:/Users/hrli1/Desktop/2018 Spring/EDA/NBA_FINAL/NBA_data/3pct_df.csv")
df_3fgm = my_read(path = "C:/Users/hrli1/Desktop/2018 Spring/EDA/NBA_FINAL/NBA_data/3fgm_df.csv")
df_3 = merge(df_3fgm,df_3pct,by = "player_id",all=TRUE)
df_pct = my_read(path = "C:/Users/hrli1/Desktop/2018 Spring/EDA/NBA_FINAL/NBA_data/pct_df.csv")
df_fgm = my_read(path = "C:/Users/hrli1/Desktop/2018 Spring/EDA/NBA_FINAL/NBA_data/fgm_df.csv")
df_all = merge(df_fgm,df_pct,by = "player_id",all=TRUE)
df_pts = my_read(path = "C:/Users/hrli1/Desktop/2018 Spring/EDA/NBA_FINAL/NBA_data/pts_df.csv")
head(df_3pct)
## player_id player_name overall X10sec_down_3 X30sec_down_3
## 1 1713 Vince Carter 0.378 0 0.0
## 2 1717 Dirk Nowitzki 0.378 1 0.5
## 3 1891 Jason Terry 0.427 0 0.0
## 4 1938 Manu Ginobili 0.392 0 0.0
## 5 2037 Jamal Crawford 0.360 0 0.5
## 6 2199 Tyson Chandler 0.000 0 0.0
## X1min_down_5 X3min._down_5 X5min._down_5 X30sec_plusminus_5
## 1 0.333 0.250 0.333 0.000
## 2 0.600 0.429 0.364 0.500
## 3 0.000 0.000 0.000 0.000
## 4 0.500 0.250 0.250 0.000
## 5 0.500 0.600 0.600 0.333
## 6 0.000 0.000 0.000 0.000
## X1min_plusminus_5 X3min_plusminus_5 X5min_plusminus_5 Team_Name
## 1 0.200 0.167 0.333 Kings
## 2 0.500 0.300 0.286 Mavericks
## 3 0.000 0.000 0.000 Bucks
## 4 0.333 0.200 0.167 Spurs
## 5 0.375 0.333 0.375 Timberwolves
## 6 0.000 0.000 0.000 Suns
ggplot()+
geom_point(data =df_pct,
aes(x = X1min_down_5, y= overall),
position = position_jitter(w = 0.01, h = 0.02),
alpha = 0.5,
size = 3)+
facet_wrap(~Team_Name)+
labs(title = "overall V.S X1min_down_5",
x = 'X1min_down_5',
y='overall')

pp = ggplot()+
geom_point(data =df_all,
aes(x = X5min_plusminus_5.x, y= X5min_plusminus_5.y,color = player_name.x),
position = position_jitter(w = 0.01, h = 0.02),
alpha = 0.5,
size = 3)+
facet_wrap(~Team_Name.x)+
labs(title = "5min_plusminus_5_percent V.S X5min_plusminus_5_actual",
x = 'X5min_plusminus_5_actual',
y='5min_plusminus_5_percent')
ggplotly(pp)
pairs(df_all[c("X10sec_down_3.x","X10sec_down_3.y","X30sec_down_3.x","X30sec_down_3.y")])

#df_all
pairs(df_all[c("X1min_down_5.x","X1min_down_5.y",
"X3min._down_5.x","X3min._down_5.y",
"X5min._down_5.x","X5min._down_5.y")])

#df_all
pairs(df_all[c("X30sec_plusminus_5.x","X30sec_plusminus_5.y",
"X1min_plusminus_5.x","X1min_plusminus_5.y",
"X3min_plusminus_5.x","X3min_plusminus_5.y")])

set.seed(1234)
library(e1071)
probs <- cbind(c(.4,.2/3,.2/3,.2/3,.4),c(.1/4,.1/4,.9,.1/4,.1/4),c(.2,.2,.2,.2,.2))
my.n <- 100
my.len <- ncol(probs)*my.n
raw <- matrix(NA,nrow=my.len,ncol=2)
raw <- NULL
for(i in 1:ncol(probs)){
raw <- rbind(raw, cbind(i,rdiscrete(my.n,probs=probs[,i],values=1:5)))
}
r <- data.frame( cbind(
as.numeric( row.names( tapply(raw[,2], raw[,1], mean) ) ),
tapply(raw[,2], raw[,1], mean),
tapply(raw[,2], raw[,1], mean) + sqrt( tapply(raw[,2], raw[,1], var)/tapply(raw[,2], raw[,1], length) ) * qnorm(1-.05/2,0,1),
tapply(raw[,2], raw[,1], mean) - sqrt( tapply(raw[,2], raw[,1], var)/tapply(raw[,2], raw[,1], length) ) * qnorm(1-.05/2,0,1)
))
names(r) <- c("group","mean","ll","ul")
gbar <- tapply(raw[,2], list(raw[,2], raw[,1]), length)
sgbar <- data.frame( cbind(c(1:max(unique(raw[,1]))),t(gbar)) )
sgbar.likert<- sgbar[,2:6]
sgbar.likert
## X1 X2 X3 X4 X5
## 1 34 1 7 7 51
## 2 7 4 84 2 3
## 3 13 13 24 27 23
library(grid)
library(lattice)
library(latticeExtra)
library(HH)
sgbar.likert<- sgbar[,2:6]
likert(sgbar.likert,
main='Example Diverging Stacked Bar Chart for Likert Scale',
sub="Likert Scale")

likert(sgbar.likert, horizontal=FALSE,
aspect=1.5,
main="Example Diverging Stacked Bar Chart for Likert Scale",
auto.key=list(space="right", columns=1,
reverse=TRUE, padding.text=2),
sub="Likert Scale")

likert(sgbar.likert,
auto.key=list(between=1, between.columns=2),
xlab="Percentage",
main="Example Diverging Stacked Bar Chart for Likert Scale",
BrewerPaletteName="Blues",
sub="Likert Scale")
